// https://leetcode.cn/problems/spiral-matrix/
/*
给你一个 m 行 n 列的矩阵 matrix ，请按照 顺时针螺旋顺序 ，返回矩阵中的所有元素。
*/
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
		int maxX = matrix[0].size();
		int minX = 0;
		int maxY = matrix.size();
		int minY = 0;
		vector<int> res;
		res.reserve(maxX * maxY);
		while(maxX - minX > 2 && maxY - minY > 2){
			cout << "minX:" << minX << ",maxX:" << maxX << ",minY:" << minY << ",maxY:" << maxY << endl;
			show(matrix, minX, maxX, minY, maxY, res);
			minX++;
			maxX--;
			minY++;
			maxY--;
		}
		
		return res;
    }
	
	// 这种容易出错
	void show(vector<vector<int>>& matrix, int minX, int maxX, int minY, int maxY, vector<int> & res){
		// 1
		for(int i = minX; i < maxX; i++){
			res.emplace_back(matrix[minY][i]);
			cout << matrix[minY][i] << ",";
		}
		// 2
		for(int i = minY + 1; i < maxY; i++){
			//cout << i << "  " << maxX-1 << endl;
			res.emplace_back(matrix[i][maxX - 1]);
			cout << matrix[i][maxX - 1] << ",";
		}
		
		// 3
		for(int i = maxX - 2; i > minX; i--){
			if(res.back() == matrix[maxY - 1][i]) continue;
			res.emplace_back(matrix[maxY - 1][i]);
			cout << matrix[maxY - 1][i] << ",";
		}
		
		// 4
		for(int i = maxY - 1; i > minY; i--){
			if(res.back() == matrix[i][minX]) continue;
			res.emplace_back(matrix[i][minX]);
			cout << matrix[i][minX] << ",";
		}
	}
	
	
};

int main(){
	vector<vector<int>> nums = {
		{1,2,3},
		{4,5,6},
		{7,8,9}
		};

	Solution so;
	auto res = so.spiralOrder(nums);
	
	for(auto item : res){
		cout << item << ",";
	}
	cout << endl;	
	return 0;
}